package br.com.android.aluno.view;

import java.io.File;
import java.net.ConnectException;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import br.com.android.aluno.adapters.ListAdapterAluno;
import br.com.android.aluno.comunicacao.ConstantesComunicacao;
import br.com.android.aluno.comunicacao.Http;
import br.com.android.aluno.dao.AlunoDao;
import br.com.android.aluno.dao.DaoFactory;
import br.com.android.aluno.model.Aluno;
import br.com.android.aluno.util.Constantes;
import br.com.android.aluno.util.UtilActivity;
import br.com.android.aluno.util.UtilFile;
import br.com.android.aluno.util.UtilJson;

public class MainActivity extends Activity implements OnItemClickListener {
	
	// Widgets
	private ListView lvListarAlunos = null;
	private ProgressDialog progressDialog = null;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Obtem as referencias aos widgets
        lvListarAlunos = (ListView) findViewById(R.id.activity_main_lvListarAlunos);
        
        /** Cria o diretorio */
		if(!Constantes.DIR_ALUNO_APP.exists()){
			Constantes.DIR_ALUNO_APP.mkdir();
		}
        
        // Cria o repositoria e as instancias de controle
        new DaoFactory(getApplicationContext());
    }

    @Override
    protected void onStart() {
    	super.onStart();
    }
    
    @Override
    protected void onResume() {
    	super.onResume();   
    	
    	AlunoDao alunoDao = new AlunoDao(MainActivity.this.getApplicationContext());
		List<Aluno> alunos = alunoDao.listar();
				
		if(alunos != null){
			ListAdapterAluno adapter = new ListAdapterAluno(this, alunos);
	        
			lvListarAlunos.setAdapter(adapter);
			lvListarAlunos.setClickable(true);
			lvListarAlunos.setOnItemClickListener(this);
			registerForContextMenu(lvListarAlunos);
	        
//			for (Aluno aluno : alunos) {
//				Log.d("aluno", aluno.toString());
//				Log.d("aluno", "#####################################################");
//			}
		}
	}
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
    		ContextMenuInfo menuInfo) {
    	if(v.getId() == R.id.activity_main_lvListarAlunos){    		
			AdapterView.AdapterContextMenuInfo info = 
					(AdapterView.AdapterContextMenuInfo) menuInfo;
			ListAdapterAluno adapter = (ListAdapterAluno) lvListarAlunos.getAdapter();				
			menu.setHeaderTitle(adapter.getAlunos().get(info.position).getNome());
			
			String[] menuItems = getResources().getStringArray(R.array.choice_list);
			for (int i = 0; i < menuItems.length; i++) {
				menu.add(Menu.NONE, i, i, menuItems[i]);
			}		
    	}
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	ListAdapterAluno adapter = (ListAdapterAluno) lvListarAlunos.getAdapter();				
				
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
				.getMenuInfo();
		Aluno selecionado = adapter.getAlunos().get(info.position);
		
		int menuItemIndex = item.getItemId();
		String[] menuItems = getResources().getStringArray(R.array.choice_list);
		String menuItemName = menuItems[menuItemIndex];
		
//		String listItemName = selecionado.getNome();
//		Log.i("aluno", String.format("Selected %s for item %s", menuItemName, listItemName));
		
		if(selecionado != null){					
			if(menuItemName.equalsIgnoreCase("Editar")){
				editar(selecionado);
				
			} else if(menuItemName.equalsIgnoreCase("Remover")){
				remover(selecionado);
				
			} else if(menuItemName.equalsIgnoreCase("Achar no mapa")){
				abrirMapa(selecionado);
				
			} else if(menuItemName.equalsIgnoreCase("Exportar para arquivo")){
				/** Salvar o aluno no arquivo de texto no cartao sd */
				File fileAluno = new File(Constantes.DIR_ALUNO_APP, selecionado.getId() + ".txt");
				
				if(fileAluno.exists()){
					fileAluno.delete();
				}
//				Log.i("aluno", selecionado.toTxt());
				UtilFile.salvarTxt(selecionado.toTxt(), fileAluno.getAbsolutePath(), false);
				
				/**	Faz o aparelho vibrar */
				UtilActivity.alertaVibrar(getApplicationContext());
			}
		}
		
		return true;
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	Intent intent;
    	
		switch (item.getItemId()) {
		case R.id.menu_novo:
			// Inicia a Activity Formulario esperando por um resultado
//			Log.d("aluno", "novo");			
			intent = new Intent(this, CadastrarActivity.class);
			startActivity(intent);			
			break;
			
		case R.id.menu_buscar:		
			// Inicia a Activity Buscar
//			Log.d("aluno", "buscar");			
			startActivity(new Intent(this, BuscarActivity.class));			
			break;

		case R.id.menu_upload:		
			// Faz o upload dos alunos para o servidor
			ListAdapterAluno adapter = (ListAdapterAluno) lvListarAlunos.getAdapter();
			try {
				String jsonList = UtilJson.getJsonArray(adapter.getAlunos());
				uploadAlunos(jsonList);
				
			} catch (Exception e) {
				e.printStackTrace();
			}			
			break;

		case R.id.menu_download:		
			// Faz o download dos alunos que estao no servidor		
			downloadAlunos();	
			break;
			
		default:
			break;
		}
    	
    	return true;
    }

    /**
     * Envia os alunos listados na tela principal
     * do dispositivo movel, para o servidor.
     */
	private void uploadAlunos(final String jsonList) {		
		progressDialog  = ProgressDialog.show(this, "Enviando...", 
    			"Aguarde...", false, true);
		
		try{
			new Thread(new Runnable() {				
				@Override
				public void run() {
					String resp = "";
					try {
						Log.i("aluno", jsonList);
						
						HashMap<String, String> map = new HashMap<String, String>();
						map.put("alunos", jsonList);
						
						Http http = Http.getInstance(Http.NORMAL);
						resp = http.doPost(ConstantesComunicacao.URL_SALVAR, map);
						
					} catch (ConnectException e) {
						Log.w("aluno", "Você não tem permissões de enviar algo para o servidor nesta rede.");
						Log.e("aluno", e.getMessage(), e);
					} finally{
//						Toast.makeText(MainActivity.this.getApplicationContext(), resp, Toast.LENGTH_SHORT).show();
						Log.i("aluno", ""+resp);
						progressDialog.dismiss();
					}
				}
			}).start();
		} catch(Throwable e){
			Log.e("aluno", e.getMessage(), e);
		}
	}

    /**
     * Envia os alunos listados na tela principal
     * do dispositivo movel, para o servidor.
     */
	private void downloadAlunos() {		
		progressDialog  = ProgressDialog.show(this, "Baixando...", 
    			"Aguarde...", false, true);
		
		try{
			new Thread(new Runnable() {				
				@Override
				public void run() {
					String resp = "";
					try {
						Http http = Http.getInstance(Http.NORMAL);
						resp = http.doPost(ConstantesComunicacao.URL_LISTAR, ""); // retorna um lista de alunos no formato Json
						List<Aluno> alunos = UtilJson.getJsonArray(resp);
						
						// Imprime
						for (Aluno aluno : alunos) {
							Log.i("aluno", aluno.toString());
						}
						
					} catch (Exception e) {
						Log.e("aluno", e.getMessage(), e);
					} finally{
//						Toast.makeText(getApplicationContext(), resp, Toast.LENGTH_SHORT).show();
						Log.i("aluno", ""+resp);
						progressDialog.dismiss();
					}
				}
			}).start();
		} catch(Throwable e){
			Log.e("aluno", e.getMessage(), e);
		}
	}

	public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
		Aluno selecionado = (Aluno) lvListarAlunos.getAdapter().getItem(position);		
		
		if(selecionado != null){
			editar(selecionado);
		}
	}

	private void abrirMapa(Aluno aluno) {
		String endereco = aluno.getEndereco();
		
		Intent it = new Intent(this, MapaActivity.class);
		it.putExtra(MapaActivity.INTENT_EXTRA_DATA_ENDERECO, endereco);
		
		startActivity(it);
	}
	
	private void editar(Aluno selecionado) {
		String idStr = String.valueOf(selecionado.getId());
		
		Intent it = new Intent(this, EditarActivity.class);
		it.putExtra(EditarActivity.INTENT_EXTRA_DATA_ID, idStr);
		
		startActivity(it);
	}
	
	private void remover(final Aluno selecionado) {
		if(selecionado != null){			
			final int idAluno = selecionado.getId();
			Log.i("aluno", "[remover] id_aluno: " + idAluno);
			
			AlertDialog.Builder alert = new AlertDialog.Builder(this);
			alert.setTitle("Confirmação");
			alert.setMessage("Deseja remover o(a) aluno(a) " + selecionado.getNome() + "?");
			
			alert.setPositiveButton("Sim", new OnClickListener() {				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					AlunoDao alunoDao = new AlunoDao(MainActivity.this.getApplicationContext());
					alunoDao.deletar(idAluno);					
					deletaFotoAluno(selecionado);
					
					onResume();
				}
			});
			
			alert.setNegativeButton("Não", new OnClickListener() {				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					dialog.cancel();
				}
			});
			
			alert.show();
		}
	}

	protected void deletaFotoAluno(Aluno aluno) {
		String nomeArq = "";
		
		if(aluno.getId() < 10){
			nomeArq += "00"+aluno.getId();
		} else if(aluno.getId() < 100){
			nomeArq += "0"+aluno.getId();
		} else{
			nomeArq += "" + aluno.getId();
		}
		
		File foto = new File(Constantes.DIR_ALUNO_APP, nomeArq + ".png");
		
		if(foto.exists()){
			foto.delete();			
		}		
	}
}
